package Control;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import Model.DinEntitas;
import Model.Entitas;
import Model.Hangya;
import Model.Hangyaboly;
import Model.Hangyaleso;
import Model.HangyaszSun;
import Model.ISpray;
import Model.Jatekter;
import Model.Kaja;
import Model.Kavics;
import Model.Majkonzerv;
import Model.Mezo;
import Model.MozgoDinEntitas;
import Model.NemMozgoDinEntitas;
import Model.OloSpray;
import Model.Szag;
import Model.SzagSpray;
import Model.Tocsa;
/*
public class Teszt
{
	public static boolean showLog = false;
	public String palya;
	Kontroller kontroller;
	
	
	public Teszt(Kontroller k)
	{
		kontroller = k;
	}
	
	public void run(BufferedReader br) throws IOException
	{
		String str;
		while((str = br.readLine()) != null)
		{
			String[] args = str.split(" ");
			boolean argumentError = false;
			
			if(args[0].equals("betolt"))
				if(args.length == 2) betolt(args[1]);
				else argumentError = true;
			
			else if(args[0].equals("fuj"))
				if(args.length == 3) fuj(args[1], args[2]);
				else argumentError = true;

			else if(args[0].equals("hozzaad"))
				if(args.length == 3) hozzaad(args[1], args[2]);
				else argumentError = true;
			
			else if(args[0].equals("jatekallas"))
				jatekallas();
			
			else if(args[0].equals("jatekkor"))
				jatekkor();
			
			else if(args[0].equals("kiir"))
				if(args.length == 2) kiir(args[1]);
				else argumentError = true;
			
			else if(args[0].equals("kilep"))
				break;
			
			else if(args[0].equals("lep"))
				if(args.length == 2) lep(args[1]);
				else argumentError = true;
			
			else if(args[0].equals("mindentLeptet"))
				mindentLeptet();
			
			else if(args[0].equals("mindentTickel"))
				mindentTickel();
			
			else if(args[0].equals("mintavetel"))
				kontroller.megjelenito.mintavetel();
			
			else if(args[0].equals("segitseg"))
				segitseg();
			
			else if(args[0].equals("tick"))
				if(args.length == 3) tick(args[1], args[2]);
				else argumentError = true;
			
			else if(args[0].equals("ujpalya"))
				if(args.length == 2) ujpalya(args[1]);
				else argumentError = true;
			
			else if(args[0].equals("veletlenEsemenyek"))
				if(args.length == 2) veletlenEsemenyek(args[1]);
				else argumentError = true;
			
			else System.out.println("Nincs ilyen parancs!");
			
			if(argumentError) System.out.println("Nem megfelelo a parameterek szama!");
		}
		
		br.close();
	}
	
	private void jatekkor()
	{
		try
		{
			mindentTickel();
			if(showLog) System.out.println(kontroller.getIdo() + ". jatekkor futasa sikeres.");
			//kontroller.mindenkitLeptet();
		}
		catch(Exception e)
		{
			if(showLog) System.out.println("A jatekkor nem tudott futni.");
		}
	}

	private void veletlenEsemenyek(String string)
	{
		boolean result;
		
		if(string.equals("0")) result = false;
		else result = true;
		
		Kontroller.veletlenEsemenyek = result;
		
		if(showLog) System.out.println("A veletlen esemenyek " + (result ? "engedelyezesre" : "leiltasra") + " kerultek.");
	}

	private void ujpalya(String meret)
	{
		if(meret.equals("kicsi"))
		{
			kontroller.jatekter = new Jatekter(2, 1);
		}
		else if(meret.equals("kozepes"))
		{
			kontroller.jatekter = new Jatekter(2, 5);
		}
		else if(meret.equals("nagy"))
		{
			kontroller.jatekter = new Jatekter(5, 10);			
		}
		else
		{
			if(showLog) System.out.println("Hiba " + meret + " meretu palya generalasakor. Lehetseges meretek: kicsi, kozepes, nagy.");
			return;
		}
		if(showLog) System.out.println("Sikeres a " + meret + " meretu palya generalasa.");
	}

	private void tick(String string, String string2)
	{
		try
		{
			int irany = Integer.parseInt(string2);
			
			NemMozgoDinEntitas nmde = this.getNemMozgoDinEntitas(string);
			MozgoDinEntitas mde = this.getMozgoDinEntitas(string);
			
			if(mde != null) mde.kovetkezoMezo = mde.holvagyok().getSzomszedok().get(irany);
			
			DinEntitas de = mde == null ? nmde : mde;
			
			de.tick();
			if(showLog) System.out.println(string + " azonositoju Entitas tick fuggvenyhivasa sikeres.");
		} 
		catch (NumberFormatException e)
		{
			if(showLog) System.out.println(string + " azonositoju Entitas tick fuggvenyhivasakor hiba keletkezett!");
		}
	}

	private void segitseg()
	{
		System.out.println("betolt			<String file>");
		System.out.println("fuj			<String spray_tipus> <int mezo_azonosito>");
		System.out.println("hangyatTeremt");
		System.out.println("hozzaad			<String entitas> <int mezo_azonosito>");
		System.out.println("jatekallas");
		System.out.println("jatekkor");
		System.out.println("kiir			<String file>");
		System.out.println("kilep");
		System.out.println("lep			<int entitas_azonosito>");
		System.out.println("mindentLeptet");
		System.out.println("mindentTickel");
		System.out.println("segitseg");
		System.out.println("tick			<int entitas_azonosito> <int irany>");
		System.out.println("ujpalya			<String meret>");
		System.out.println("veletlenEsemenyek	<boolean veletlen>");
	}

	private void mindentTickel()
	{
		try
		{
			kontroller.mindenkitLeptet();
			if(showLog) System.out.println("Minden a jatekterben talalhato Entitas tick fuggvenye meghivodott.");
		} 
		catch (Exception e)
		{
			if(showLog) System.out.println("Hiba a globalis tick hivasakor.");
		}
	}

	private void mindentLeptet()
	{
		try
		{
			for(MozgoDinEntitas mde : kontroller.jatekter.getMozgoDinEntitasok())
				mde.lep();
			if(showLog) System.out.println("Minden a jatekterben tallhato mozgasra kepes Entitas lepett.");
		}
		catch (Exception e)
		{
			if(showLog) System.out.println("Hiba a globalis lepteteskor.");
		}
	}

	private void lep(String string)
	{
		try
		{
			getMozgoDinEntitas(string).lep();
			if(showLog) System.out.println(string + " azonositoju Entitas lepett a " + getMozgoDinEntitas(string).holvagyok().getAzonosito() + " mezore.");
		}
		catch(Exception e)
		{
			if(showLog) System.out.println(string + " azonositoju Entitas nem tudott lepni.");
		}
	}

	private void kiir(String string) throws IOException
	{
		try
		{
			BufferedWriter bw = new BufferedWriter(new FileWriter(string));
			bw.write("ujpalya " + palya);
			bw.write("veletlenEsemenyek " + Kontroller.veletlenEsemenyek);
			
			for(Mezo m : kontroller.jatekter.getMezoLista())
				for(int i = 0; i < m.getEntitasok().size(); i++)
				{
					String str = m.getEntitasok().get(i).kiir();
					bw.write("hozzaad" + str.substring(0, str.indexOf('(')));
				}
			
			bw.close();
			
			if(showLog) System.out.println("A jelenlegi allapot kiirasa sikerult a " + string + " fajlba.");
		}
		catch(Exception e)
		{
			if(showLog) System.out.println("Hiba a " + string + " fajl irasa kozben.");
		}
	}

	private void jatekallas()
	{
		if(kontroller.jatekter == null)
		{
			System.out.println("NINCS PALYA");
			return;
		}
		int mezo = 0;
	    for(int i = 1; i <= kontroller.jatekter.getMagassag(); i++)
	    {
	        if(i % 2 == 1) System.out.print('\t');
	        for(int j = 1; j <= kontroller.jatekter.getSzelesseg(); j++)
	        {
	            System.out.print(kontroller.jatekter.getMezoLista().get(mezo++).kiir());
	            if(j != kontroller.jatekter.getSzelesseg()) System.out.print("\t\t");
	        }
	        System.out.print('\n');
	    }
	    System.out.print('\n');
	    
		for(Mezo m : kontroller.jatekter.getMezoLista())
		{
			if(m.getEntitasok().size() == 0) continue;
			System.out.print(m.kiir() + ":");
			for(int i = 0; i < m.getEntitasok().size(); i++)
				System.out.print((i == 0 ? "" : ",") + m.getEntitasok().get(i).kiir());
			System.out.print('\n');
		}
	}

	private void hozzaad(String string, String string2)
	{
		Entitas e;
		if(string.equals("Szag") || string.equals("S")) e = new Szag(kontroller.jatekter);
		else if(string.equals("Hangyaboly") || string.equals("HB")) e = new Hangyaboly(kontroller.jatekter);
		else if(string.equals("Hangya") || string.equals("H")) e = new Hangya(kontroller.jatekter);
		else if(string.equals("Hangyaszsun") || string.equals("HS")) e = new HangyaszSun(kontroller.jatekter);
		else if(string.equals("Hangyaleso") || string.equals("HL")) e = new Hangyaleso();
		else if(string.equals("Majkonzerv") || string.equals("MK"))
		{
			e = new Majkonzerv();
			kontroller.jatekter.addKaja((Kaja)e);
		}
		else if(string.equals("Kavics") || string.equals("K")) e = new Kavics();
		else if(string.equals("Tocsa") || string.equals("T")) e = new Tocsa();
		else if(string.equals("OloSpray") || string.equals("OS")) e = new OloSpray();
		else if(string.equals("SzagSpray") || string.equals("SS")) e = new SzagSpray();
		else
		{
			if(showLog) System.out.println(string + " tipusu Entitas lerakasa kozben hiba tortent a(z) " + string2 + " azonositoju mezore.");
			return;
		}
		
		e.iderak(getMezo(string2));
		if(showLog) System.out.println(string + " tipusu Entitas lerakasa a(z) " + string2 + " azonositoju mezore sikeres.");
	}

	private void fuj(String string, String string2)
	{
		ISpray is;
		if(string.equals("OloSpray")) is = new OloSpray();
		else if(string.equals("SzagSpray")) is = new SzagSpray();
		else
		{
			if(showLog) System.out.println(string + " tipusu spray fujasa kozben hiba tortent a(z) " + string2 + " azonositoju mezore.");
			return;
		}
		is.fuj(getMezo(string2));
		if(showLog) System.out.println(string + " tipusu spray fujva a(z) " + string2 + " azonositoju mezore.");
	}

	public void betolt(String str) throws IOException
	{
		try
		{
			this.run(new BufferedReader(new FileReader(str)));
			if(showLog) System.out.println(str + " betoltese megtortent.");
		}
		catch(Exception e)
		{
			if(showLog) System.out.println(str + " betoltesekor hiba tortent!");
		}
	}
	
	public Mezo getMezo(String str)
	{
		int azon = Integer.parseInt(str);
		for(Mezo m : kontroller.jatekter.getMezoLista())
			if(m.getAzonosito() == azon)
				return m;
		
		return null;
	}
	
	public MozgoDinEntitas getMozgoDinEntitas(String str)
	{
		int azon = Integer.parseInt(str);
		for(MozgoDinEntitas mde : kontroller.jatekter.getMozgoDinEntitasok())
			if(mde.getAzonosito() == azon)
				return mde;

		return null;
	}
	
	public NemMozgoDinEntitas getNemMozgoDinEntitas(String str)
	{
		int azon = Integer.parseInt(str);
		
		for(NemMozgoDinEntitas nmde : kontroller.jatekter.getNemMozgoDinEntitasok())
			if(nmde.getAzonosito() == azon)
				return nmde;
		
		return null;
	}
}*/